home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / earcd / phase5 / ppcrelease / examples / msg6.c < prev    next >
C/C++ Source or Header  |  1998-02-21  |  5KB  |  171 lines

  1. /* This test program sends 1000 messages to the M68k and
  2.    shows how long this takes.
  3.    The Messages are send asynchron and every msg must
  4.    be replied after another.
  5.    Each Message has the Body "Text sent by PPC processor\n"
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <exec/nodes.h>
  10. #include <exec/lists.h>
  11. #include <exec/memory.h>
  12. #include <utility/tagitem.h>
  13. #include <powerup/ppclib/interface.h>
  14. #include <powerup/ppclib/message.h>
  15. #include <powerup/ppclib/tasks.h>
  16. #include <powerup/proto/ppc.h>
  17. #include <proto/exec.h>
  18. #include <proto/dos.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include "time.h"
  22. #include "time_protos.h"
  23.  
  24. #define    MSGCOUNT    1000
  25. #define    DEBUG        0
  26.  
  27. struct StartupData
  28. {
  29.     void    *MsgPort;
  30.     ULONG    MsgCount;
  31. };
  32.  
  33. extern struct Library    *SysBase;
  34.  
  35. int    main(void)
  36. {
  37. struct Library        *PPCLibBase;
  38. struct TagItem        MyTags[10];
  39. void            *M68kPort;
  40. void            *StartupMsg;
  41. void            *PPCMsg;
  42. void            *ElfObject;
  43. void            *Task;
  44. struct StartupData    *StartupData;
  45. void            *MyTimerObject;
  46. ULONG            i;
  47. ULONG            MsgID;
  48.  
  49.   printf("Opening ppc.library\n");
  50.   if (PPCLibBase = OpenLibrary("ppc.library", 44))
  51.   {
  52.     if (MyTimerObject=TimerCreateObject())
  53.     {
  54.       printf("Loading PPC object\n");
  55.       if (ElfObject=PPCLoadObject("PROGDIR:Msg6PPC.elf"))
  56.       {
  57.         printf("Creating message port...");
  58.         MyTags[0].ti_Tag    =    TAG_DONE;
  59.         if (M68kPort = PPCCreatePort(MyTags))
  60.         {
  61.           if (StartupMsg = PPCCreateMessage(M68kPort, 0))
  62.           {
  63.             printf("Allocating StartupData\n");
  64.             if (StartupData = PPCAllocVec(sizeof(struct StartupData), MEMF_ANY))
  65.             {
  66.               StartupData->MsgPort    =    M68kPort;
  67.               StartupData->MsgCount    =    MSGCOUNT;
  68.  
  69.               printf("Creating PPC task\n");
  70.               MyTags[0].ti_Tag        =    PPCTASKTAG_STARTUP_MSG;
  71.               MyTags[0].ti_Data        =(ULONG) StartupMsg;
  72.  
  73.               MyTags[1].ti_Tag        =    PPCTASKTAG_STARTUP_MSGDATA;
  74.               MyTags[1].ti_Data        =(ULONG) StartupData;
  75.  
  76.               MyTags[2].ti_Tag        =    PPCTASKTAG_STARTUP_MSGLENGTH;
  77.               MyTags[2].ti_Data        =    0;
  78.  
  79.               MyTags[3].ti_Tag        =    PPCTASKTAG_STARTUP_MSGID;
  80.               MyTags[3].ti_Data        =    0;
  81.  
  82.               MyTags[4].ti_Tag        =    PPCTASKTAG_MSGPORT;
  83.               MyTags[4].ti_Data        =    TRUE;
  84.  
  85.               MyTags[5].ti_Tag        =    TAG_DONE;
  86.  
  87.               if (Task = PPCCreateTask(ElfObject, MyTags))
  88.               {
  89.                 printf("Receive 1000 messages with a *Body* and reply them...");
  90.                 TimerSetAttr(MyTimerObject,TIMERTAG_START);
  91.                 i    =    0;
  92.                 while (i<MSGCOUNT)
  93.                 {
  94.                   PPCWaitPort(M68kPort);
  95.                   while (i<MSGCOUNT && (PPCMsg = PPCGetMessage(M68kPort)))
  96.                   {
  97. #if DEBUG
  98.                     MsgID    =    PPCGetMessageAttr(PPCMsg, PPCMSGTAG_MSGID);
  99.                     Printf("Received 0x%lx(%ld)=%ld Port 0x%lx\n",
  100.                            PPCMsg,
  101.                            MsgID,
  102.                            i,
  103.                            ((struct Message*) PPCMsg)->mn_ReplyPort);
  104. #endif
  105.                     PPCReplyMessage(PPCMsg);
  106.                     i++;
  107.                   }
  108.                 }
  109.                 TimerSetAttr(MyTimerObject,TIMERTAG_STOP);
  110.                 TimerShow(MyTimerObject);
  111.  
  112.                 printf("Waiting for Task Finish Msg...\n");
  113.                 for (;;)
  114.                 {
  115.                   if ((PPCMsg=PPCGetMessage(M68kPort)) == StartupMsg)
  116.                   {
  117.                     printf("Ahh..the expected Startup=Finish Msg was received.\nNow we can savely free all resources.\n");
  118.                     break;
  119.                   }
  120.                   else
  121.                   {
  122.                     printf("Some non replied Msg 0x%lx was found..wait\n",
  123.                            PPCMsg);
  124.                     PPCWaitPort(M68kPort);
  125.                   }
  126.                 }
  127.  
  128.                 printf("Deleting message...\n");
  129.               }
  130.               else
  131.               {
  132.                 Printf("Could not create PPC task\n");
  133.               }
  134.               PPCFreeVec(StartupData);
  135.             }
  136.             else
  137.             {
  138.               Printf("Could not alloc Startup Data\n");
  139.             }
  140.             PPCDeleteMessage(StartupMsg);
  141.           }
  142.           else
  143.           {
  144.             Printf("Could not create Startup message\n");
  145.           }
  146.           printf("Deleting message port...");
  147.           while (PPCDeletePort(M68kPort) == FALSE);
  148.         }
  149.         else
  150.         {
  151.           Printf("Could not create M68k MsgPort\n");
  152.         }
  153.         printf("Unloading PPC object\n");
  154.         PPCUnLoadObject(ElfObject);
  155.       }
  156.       else
  157.       {
  158.         Printf("Could not load the elfobject\n");
  159.       }
  160.       TimerDeleteObject(MyTimerObject);
  161.     }
  162.     printf("Closing ppc.library\n");
  163.     CloseLibrary(PPCLibBase);
  164.   }
  165.   else
  166.   {
  167.     Printf("Could not open ppc.library v44+\n");
  168.   }
  169. }
  170.  
  171.